/*
通过Socket对象，我们可以使用对应的I/O流进行网络数据传输
传输肯定要用到输入流和输出流,Socket对象都提供了getInputStream和getOutputStream
服务端接收客户端的数据，要用OutputStreamReader读取客户端的输出流，然后可以选择用OutputStreamWriter写到文件里
 */
package MySocket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class DataServer {
    public static void main(String[] args) {
        try(ServerSocket serverSocket = new ServerSocket(8086)){
            System.out.println("等待客户端连接...");
            Socket ssocket = serverSocket.accept();  //使用accept()接收客户端连接，不设置超时时间，没有连接时会一直卡在这

            ssocket.setSoTimeout(5000);  //设置Socket超时时间，如果客户端超过这个时间不发送数据，或接收不到数据，就关闭Socket。以毫秒为单位。
            // 指的是客户端连接后不发送数据，而不是等待客户端连接的时间，抛出的异常是java.net.SocketTimeoutException: Read timed out

            System.out.println("客户端已连接，IP地址为：" + ssocket.getInetAddress().getHostAddress()
                    +"主机名为" + ssocket.getInetAddress().getHostName());
            System.out.println("开始接收客户端内容...等待" + 5 +"秒");
            BufferedReader reader = new BufferedReader(new InputStreamReader(ssocket.getInputStream()));
            //用InputStreamReader给ServerSocket对象getInputStream()包装一下，但一次只能读一个字符，再用BufferedReader包装一下,可以读取一行

            String content = reader.readLine();
            System.out.println(content); //BufferedReader的readLine()方法，client那边发送数据必须加一个换行符，不然读不了。

            //客户端可以给服务端发送数据，同理服务端也可以给客户端回复数据，也是用OutputStream发送
            OutputStreamWriter writer = new OutputStreamWriter(ssocket.getOutputStream());
            writer.write("服务端接收到数据，数据内容为" + content + "\n");
            writer.flush();  //记得刷新下，不刷新不发送
            writer.close();

            ssocket.close();  //sscoket没有放到try with resource语法糖里面，所有要手动close

        }catch (IOException e){
            e.printStackTrace();
        }
    }

}
